import globalVariable from '@/api/global_variable.js'

var SIGN_REGEXP = /([yMdhsm])(\1*)/g;
var DEFAULT_PATTERN = 'yyyy-MM-dd';


//针对pc端业务时间处理
var ilinkTimeformat={
    //格式化时间成指定的格式； param{new date , string format}
    format:function(date, pattern) {
        pattern = pattern || DEFAULT_PATTERN;
        return pattern.replace(SIGN_REGEXP, function ($0) {
            switch ($0.charAt(0)) {
                case 'y': return padding(date.getFullYear(), $0.length);
                case 'M': return padding(date.getMonth() + 1, $0.length);
                case 'd': return padding(date.getDate(), $0.length);
                case 'w': return date.getDay() + 1;
                case 'h': return padding(date.getHours(), $0.length);
                case 'm': return padding(date.getMinutes(), $0.length);
                case 's': return padding(date.getSeconds(), $0.length);
            }
        });
    },
    parse:function(dateString, pattern) {
        var matchs1 = pattern.match(SIGN_REGEXP);
        var matchs2 = dateString.match(/(\d)+/g);
        if (matchs1.length == matchs2.length) {
            var _date = new Date(1970, 0, 1);
            for (var i = 0; i < matchs1.length; i++) {
                var _int = parseInt(matchs2[i]);
                var sign = matchs1[i];
                switch (sign.charAt(0)) {
                    case 'y': _date.setFullYear(_int); break;
                    case 'M': _date.setMonth(_int - 1); break;
                    case 'd': _date.setDate(_int); break;
                    case 'h': _date.setHours(_int); break;
                    case 'm': _date.setMinutes(_int); break;
                    case 's': _date.setSeconds(_int); break;
                }
            }
            return _date;
        }
        return null;
    },
    //多少个小时前的时间； param{ int hours, string format}
    hoursAgo:function(hours, pattern) {
      return this.format(new Date(new Date().getTime() - 3600 * 1000 *parseInt(hours)),pattern)
    }
}
function padding(s, len) {
  var len = len - (s + '').length;
  for (var i = 0; i < len; i++) { s = '0' + s; }
  return s;
}

//时间筛选组对象定义
function intTimePickerOptions() {
  return ({
        shortcuts: [{
          text: '最近一周',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近一个月',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近三个月',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
            picker.$emit('pick', [start, end]);
          }
        }]
      });
}
//时间筛选组对象定义
function intDatePickerOptions() {
  return ({
          /*disabledDate(time) {
            return time.getTime() > Date.now();
          },*/
          shortcuts: [{
            text: '今天',
            onClick(picker) {
              picker.$emit('pick', new Date());
            }
          }, {
            text: '昨天',
            onClick(picker) {
              const date = new Date();
              date.setTime(date.getTime() - 3600 * 1000 * 24);
              picker.$emit('pick', date);
            }
          }, {
            text: '一周前',
            onClick(picker) {
              const date = new Date();
              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit('pick', date);
            }
          }]
        });
}

/**
 * @Author: Chili
 * @Description: 百度地图通用方法
 * @Date: 2019-07-18 14:09:37
 */
//根据地址描述获得坐标信息
function getAddressFromPoint(address) {
  if(address){
      // 创建地址解析器实例     
      let myGeo = new BMap.Geocoder();      
      // 将地址解析结果显示在地图上 
      myGeo.getPoint(address, function(point){      
          if (point) {      
              return  point;
          }      
      });
  }
} 

//指定经纬度获取地址
function getPointFromAddress(point) {
  if(point){
      // 创建地址解析器实例     
      let myGeo = new BMap.Geocoder();      
      // 根据坐标得到地址描述  
      myGeo.getPoint(address, function(result){      
          if (result) {      
              return  result;
          }      
      });
  }
} 

/**
 * @Author: Chili
 * @Description: doker类型 《=》 服务端类型
 * 必传 type:1 转成服务端类型 2 转成doker类型
 * 必传 prams:类型集合逗号分隔
 * @Date: 2019-07-26 11:29:43
 */
function transDokerAndServerType(type,prams) {
  let GLOBAL = globalVariable;
  let callArr = [];
  let responIds = [];
  if(type && prams){
    if(type==1){
        let arr = prams.split(",");
        for(let i=0;i<arr.length;i++){
            if(GLOBAL.dokerJsonData[arr[i]].serverId){
              responIds.push(GLOBAL.dokerJsonData[arr[i]].serverId);
              callArr[GLOBAL.dokerJsonData[arr[i]].serverId] = GLOBAL.dokerJsonData[arr[i]];
            }
        }
        callArr.targetIds = responIds.toString();
    }else if(type==2){
        let arr1 = prams.split(",");
        for(let j=0; j<arr1.length;j++){
            for(let item in GLOBAL.dokerJsonData){
                if(GLOBAL.dokerJsonData[item].serverId && GLOBAL.dokerJsonData[item].serverId == arr1[j]){
                    responIds.push(item);
                    callArr[item] = GLOBAL.dokerJsonData[item];
                }
            }
        }
        callArr.targetIds = responIds.toString();
    }
    return callArr;
  }
}

//身份证号码格式化
function transID(value) {
  if ( value && value.length>6) {
      return (value.substring(0,  3) +"************"+ value.substring( value.length - 3));
  }
  return '';
}

//维保任务完成度 
//计算两个整数的百分比值  精确到2位有效数字 isparseInt 表示取整
function completionDegree(num,total,isparseInt){
    var num = parseFloat(num || 0); 
    var total = parseFloat(total || 0); 
    if (isNaN(num) || isNaN(total)) { 
      return 0 
    } 
    if (num > total) { 
      return 100; 
    } 
    if(isparseInt){
      return total <= 0 ? 0 : (Math.round(num / total) )*100; 
    } else {
      return total <= 0 ? 0 : Math.round(num * 100 * 100 / total) / 100
    }
}

/**
 * 是否全屏并按键ESC键的方法
 */
function checkFull() {
  let isFull =  /*parent.document.fullscreenEnabled || */top.window.fullScreen || parent.document.webkitIsFullScreen || parent.document.msFullscreenEnabled;
  //to fix : false || undefined == undefined
  if(isFull === undefined) isFull = false;
  return isFull;
}

/****************************************解决JS浮点数(小数)计算加减乘除的BUG    Start****************************************/

/**
** 加法函数，用来得到精确的加法结果
** 说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
** 调用：accAdd(arg1,arg2)
** 返回值：arg1加上arg2的精确结果
**/
function accAdd(arg1, arg2) {
    if (isNaN(arg1)) {
        arg1 = 0;
    }
    if (isNaN(arg2)) {
        arg2 = 0;
    }
    arg1 = Number(arg1);
    arg2 = Number(arg2);
    var r1, r2, m, c;
    try {
        r1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
        r2 = 0;
    }
    c = Math.abs(r1 - r2);
    m = Math.pow(10, Math.max(r1, r2));
    if (c > 0) {
        var cm = Math.pow(10, c);
        if (r1 > r2) {
            arg1 = Number(arg1.toString().replace(".", ""));
            arg2 = Number(arg2.toString().replace(".", "")) * cm;
        } else {
            arg1 = Number(arg1.toString().replace(".", "")) * cm;
            arg2 = Number(arg2.toString().replace(".", ""));
        }
    } else {
        arg1 = Number(arg1.toString().replace(".", ""));
        arg2 = Number(arg2.toString().replace(".", ""));
    }
    return (arg1 + arg2) / m;
}

//给Number类型增加一个add方法，调用起来更加方便。
/*Number.prototype.add = function(arg) {
    return accAdd(this, arg);
};*/

/**
** 减法函数，用来得到精确的减法结果
** 说明：javascript的减法结果会有误差，在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。
** 调用：accSub(arg1,arg2)
** 返回值：arg1加上arg2的精确结果
**/
function accSub(arg1, arg2) {
    if (isNaN(arg1)) {
        arg1 = 0;
    }
    if (isNaN(arg2)) {
        arg2 = 0;
    }
    arg1 = Number(arg1);
    arg2 = Number(arg2);

    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

// 给Number类型增加一个mul方法，调用起来更加方便。
/*Number.prototype.sub = function(arg) {
    return accSub(this, arg);
};*/

/**
** 乘法函数，用来得到精确的乘法结果
** 说明：javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
** 调用：accMul(arg1,arg2)
** 返回值：arg1乘以 arg2的精确结果
**/
function accMul(arg1, arg2) {
    if (isNaN(arg1)) {
        arg1 = 0;
    }
    if (isNaN(arg2)) {
        arg2 = 0;
    }
    arg1 = Number(arg1);
    arg2 = Number(arg2);
    
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length;
    }
    catch (e) {
    }
    try {
        m += s2.split(".")[1].length;
    }
    catch (e) {
    }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}

// 给Number类型增加一个mul方法，调用起来更加方便。
/*Number.prototype.mul = function(arg) {
    return accMul(this, arg);
};
*/
/** 
** 除法函数，用来得到精确的除法结果
** 说明：javascript的除法结果会有误差，在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
** 调用：accDiv(arg1,arg2)
** 返回值：arg1除以arg2的精确结果
**/
function accDiv(arg1, arg2) {
    if (isNaN(arg1)) {
        arg1 = 0;
    }
    if (isNaN(arg2)) {
        arg2 = 0;
    }
    arg1 = Number(arg1);
    arg2 = Number(arg2);
    
    var t1 = 0, t2 = 0, r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
    }
    try {
        t2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
    }
    r1 = Number(arg1.toString().replace(".", ""));
    r2 = Number(arg2.toString().replace(".", ""));
    return (r1 / r2) * Math.pow(10, t2 - t1);
}

//给Number类型增加一个div方法，调用起来更加方便。
/*Number.prototype.div = function(arg) {
    return accDiv(this, arg);
};*/
/****************************************解决JS浮点数(小数)计算加减乘除的BUG  End****************************************/


export default {
    ilinkTimeformat,
    transID,
    intDatePickerOptions,
    intTimePickerOptions,
    checkFull,
    completionDegree,
    accAdd,
    accSub,
    accMul,
    accDiv,
    getAddressFromPoint,
    getPointFromAddress,
    transDokerAndServerType
};